package com.zxy.ider.ehome.DataBase;

import android.content.Context;
import android.util.Log;

import org.xutils.DbManager;
import org.xutils.db.table.TableEntity;
import org.xutils.ex.DbException;
import org.xutils.x;

/**
 * Created by ider-eric on 2017/7/10.
 */

public class DBManager {
    private DbManager.DaoConfig daoConfig;
    private static DBManager manager;
    public static DBManager getInstance() {
        if (manager == null) {
            manager = new DBManager();
        }
        return manager;
    }

    public  DbManager getDb(){
        return x.getDb(daoConfig);
    }
    /**
     * 初始化获取数据库的配置信息
     */
    public void initDaoConfig(){
        daoConfig = new DbManager.DaoConfig()
                .setDbName("my.db")  //设置数据库名称
                .setDbVersion(1)  //设置数据库版本
                //.setDbDir(getCacheDir().getAbsoluteFile()) //设置数据库保存的路径
                .setAllowTransaction(true) //设置允许开启事务
                .setDbUpgradeListener(new DbManager.DbUpgradeListener() {
                    @Override
                    public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
                        //db.addColumn("表名","需要增加的列名");数据库更新监听
                    }
                })
                .setDbOpenListener(new DbManager.DbOpenListener() {
                    @Override
                    public void onDbOpened(DbManager db) {
                        //开启WAL.对写入加速提示很大
                        db.getDatabase().enableWriteAheadLogging();
                    }
                })
                .setTableCreateListener(new DbManager.TableCreateListener() {
                    @Override
                    public void onTableCreated(DbManager db, TableEntity<?> table) {
                        Log.i("tag", "onTableCreated: 创建了表:"+table.getName());
                    }
                });
    }
    /**
     * 删除数据
     */
    public void deleteData(){
        //第一种,根据主键来删除
        DbManager db = x.getDb(daoConfig);
//            db.deleteById(Student.class,5);//删除主键为5的值
//
//            //第二种方法,找到符合条件的第一条数据  .findAll()就是找所有符合条件的了
//            Student student = db.selector(Student.class).where("name", "=", "学生11").findFirst();
//            db.delete(student);//先找到,再删除 ,需要判断为不为空
//
//            //第三种,删除那name=学生9 且 sex=女 的数据
//            db.delete(Student.class, WhereBuilder.b("name","=" ,"学生9").and("sex","=","女"));
//
//            //第四种,删除所有数据,但是表还在
//            db.delete(Student.class);

        //db.dropTable(Student.class);删除表
        //db.dropDb();删除数据库

    }

    /**
     * 更新数据
     */
    public void onUPdataData(){
//        try {
//            DbManager db = x.getDb(daoConfig);
//            //先找到要更新的数据,再设置值,然后更新,当然你也可以使用上面查询数据的方式
//            Student stu3 = db.findById(Student.class, 3);//找到主键为3的值
//            stu3.setAge(50);
//            db.update(stu3,"age");//更新stu3列名为age的数据
//        } catch (DbException e) {
//            e.printStackTrace();
//        }
    }

    /**
     * 查询数据
     */
    public void onQuertyData(){
//        try {
//            DbManager db = x.getDb(daoConfig);
//            Student student = db.findById(Student.class, 2);//根据主键来查找student表里的数据
//            Student first = db.findFirst(Student.class);//返回当前表的第一条数据
//            Log.i("tag", "第一条数据:"+first);
//            //查询所有数据
//            List<Student> all = db.findAll(Student.class);
//            Log.i("tag", "所有数据:"+all.toString());
//            //按条件查找,查询年龄大于15的
//            List<DbModel> dbModelAll = db.findDbModelAll(new SqlInfo("select * from student where age > 15"));
//            for (int i = 0; i < dbModelAll.size() ; i++) {
//                String name = dbModelAll.get(i).getString("name");
//                String age = dbModelAll.get(i).getString("age");
//                String sex = dbModelAll.get(i).getString("sex");
//                Log.i("tag", "查询的数据: name="+name+",age="+age+",sex="+sex);
//            }
//            //第二种条件查找
//            List<Student> all1 = db.selector(Student.class).where("age", ">", 14).and("age", "<", 16).findAll();
//            //第三种
//            List<Student> all2 = db.selector(Student.class).expr("age>14 and age<17").findAll();
//            Log.i("tag", "第二种:"+all1.toString());
//        } catch (DbException e) {
//            e.printStackTrace();
//        }
    }

    /**
     * 增加数据,插入数据库操作的时候会判断是否存在这张表，如果不存在就会去创建,所以不需要手动去创建表了
     */
    public void addData(){
//        try {
//            //根据配置信息获取操作数据的db对象
//            DbManager db = x.getDb(daoConfig);
//            List<Student> list = new ArrayList<Student>();
//            for (int i = 0; i < 10; i++) {
//                Student stu = new Student();
//                stu.setAge(10+i);
//                stu.setName("学生"+i);
//                stu.setSex(i % 2 == 0? "男":"女");
//                list.add(stu);
//                //db.save(stu);//插入一条数据
//            }
//            db.save(list);//保存实体类或实体类的List到数据库
//            //db.replace(list);保存或更新实体类或实体类的List到数据库, 根据id和其他唯一索引判断数据是否存在
//            //db.saveOrUpdate(list);保存或更新实体类或实体类的List到数据库, 根据id对应的数据是否存在.
//            //db.saveBindingId(list);保存实体类或实体类的List到数据库,如果该类型的id是自动生成的, 则保存完后会给id赋值.
//            /**
//             * 1.如果在你建表的时候你的主键设置成自增长，那么你在插入数据的时候直接调replace方法就可以了，
//             *   但是saveOrUpdate只能达到插入的效果，达不到更新原有数据的效果.
//             * 2.如果在你建表的时候你的主键设置成不是自增长，replace方法当然可以插入，saveOrUpdate方法既可以插入也可以达到更新的效果
//             */
//        } catch (DbException e) {
//            e.printStackTrace();
//        }
    }
}
